package com.wolf.cx330.workmanager

import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import androidx.work.*
import com.wolf.cx330.R
import java.util.concurrent.TimeUnit

class WorkAct : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_work)
    }


    private fun test() {
        //  一次性工作最简单的设置方式
        val uploadWorkerRequest: WorkRequest = OneTimeWorkRequest.from(UploadWorker::class.java)
        //  一次性工作的builder模式的设置方式
        val uploadWorkRequest: WorkRequest = OneTimeWorkRequestBuilder<UploadWorker>()
            .addTag("TAG")
            .build()


        //  定期调度工作设置方式
        //  重复间隔必须大于或等于 PeriodicWorkRequest.MIN_PERIODIC_INTERVAL_MILLIS [15分钟]
        //  灵活间隔必须大于或等于 PeriodicWorkRequest.MIN_PERIODIC_FLEX_MILLIS [5分钟]
        //  每一小时执行一次
        val saveRequest = PeriodicWorkRequestBuilder<UploadWorker>(
            1, TimeUnit.HOURS
        ).build()
        //  每两小时执行一次
        val saveRequest2 = PeriodicWorkRequestBuilder<UploadWorker>(
            2, TimeUnit.HOURS
        ).build()
        //  每两小时的后15分钟内运行一次
        val saveRequest3 = PeriodicWorkRequestBuilder<UploadWorker>(
            2, TimeUnit.HOURS,
            15, TimeUnit.MINUTES
        )
        //  执行某工作
        //  WorkManager.getInstance(this).enqueue(uploadWorkRequest)
        //  创建一个约束
        val constraints = Constraints.Builder()
            //  WIFI
            .setRequiredNetworkType(NetworkType.UNMETERED)
            //  充电时
            .setRequiresCharging(true)
            .build()
        val myWorkRequest: WorkRequest = OneTimeWorkRequestBuilder<UploadWorker>()
            //  设置约束
            .setConstraints(constraints)
            //  当没有约束或者约束被满足时,工作会立即被执行,如果不想让工作立即被执行 那么需要initialDelay加个延迟
            .setInitialDelay(10, TimeUnit.MINUTES)
            .build()
        //  退避延迟时间和退避延迟政策
        //  如果需要让WorkManager 重试工作, 可以从工作器返回Result.retry(), 然后,系统将根据 退避延时时间和退避政策重新调度工作
        //  BackoffPolicy.LINEAR 10 20 30 40 50
        //  BackoffPolicy.EXPONENTIAL 10 20 40 80 160
        val myWorkRequest1: WorkRequest = OneTimeWorkRequestBuilder<UploadWorker>()
            .setBackoffCriteria(
                BackoffPolicy.EXPONENTIAL,
                OneTimeWorkRequest.MIN_BACKOFF_MILLIS,
                TimeUnit.MILLISECONDS
            )
            .build()
        // TAG 为工作器设置唯一值 没啥好说的
        val tagWorkRequest: WorkRequest = OneTimeWorkRequestBuilder<UploadWorker>()
            .addTag("I'm TAG")
            .build()
        //  *** 为工作器设置数据
        val dataWorkRequest: WorkRequest = OneTimeWorkRequestBuilder<UploadWorker>()
            .setInputData(
                workDataOf(
                    "IMAGE_URI" to "http://..."
                )
            )
            .build()
    }

    private fun test2() {
        val workRequest = PeriodicWorkRequestBuilder<UploadWorker>(1, TimeUnit.HOURS)
            .setConstraints(
                Constraints.Builder()
                    .setRequiresCharging(true)
                    .build()
            )
            .build()
        //  enqueueUnique 可以保证对应workName的任务不会被重复添加到工作器中..
        //  uniqueWorkName : 唯一工作名称
        //  existing : 冲突解决策略
        //  # REPLACE : 新工作将替换现有工作[取消现有工作]
        //  # KEEP : 保留现有工作,忽略新工作
        //  # APPEND : 现有工作完成后,执行新工作[如果现有工作死了,那么新工作也死了]
        //  # APPEND_OR_REPLACE : 现有工作成功执行或者死了后,执行新工作
        WorkManager.getInstance(this).enqueueUniquePeriodicWork(
            "uploadFile",
            ExistingPeriodicWorkPolicy.KEEP,
            workRequest
        )
    }

}